package br.com.citframework.integracao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import br.com.citframework.util.JNDIFactory;
import br.com.citframework.util.ReflectionUtils;
public abstract class ConnectionProviderAbstractTest {
protected static final String EMPTY_STRING = "";
private static final String JNDI_JAVA = "java:";
private static final String JNDI_JAVA_JDBC = JNDI_JAVA.concat("/jdbc");
protected static final String JNDI_DATASOURCE = JNDI_JAVA_JDBC.concat("/testDS");
protected static final String JNDI_DATASOURCE_NOTFOUND = JNDI_JAVA_JDBC.concat("/notFoundTestDS");
protected static final String EMBEDDED_JAVADB_JDBC_USER = "root";
protected static final String EMBEDDED_JAVADB_JDBC_PASSWORD = "root";
protected static final String EMBEDDED_JAVADB_JDBC_CLASS = "org.h2.Driver";
protected static final String EMBEDDED_JAVADB_JDBC_URL = "jdbc:h2:~/test";
private static Context context;
private static Connection connection;
private static Connection openConnection() throws Exception {
Class.forName(EMBEDDED_JAVADB_JDBC_CLASS);
return DriverManager.getConnection(EMBEDDED_JAVADB_JDBC_URL);
}
protected static Connection getConnection() throws Exception {
if (connection == null) {
connection = openConnection();
}
return connection;
}
@BeforeClass
public static void setUpClass() throws Exception {
if (getConnection().isClosed()) {
connection = openConnection();
}
try (Statement stmt = getConnection().createStatement()) {
stmt.executeUpdate(String.format("create user if not exists %s password '%s'", EMBEDDED_JAVADB_JDBC_USER, EMBEDDED_JAVADB_JDBC_PASSWORD));
stmt.executeUpdate(String.format("alter user %s set password '%s'", EMBEDDED_JAVADB_JDBC_USER, EMBEDDED_JAVADB_JDBC_PASSWORD));
stmt.executeUpdate(String.format("alter user %s admin true", EMBEDDED_JAVADB_JDBC_USER));
}
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
context = new InitialContext();
context.createSubcontext(JNDI_JAVA);
context.createSubcontext(JNDI_JAVA_JDBC);
final JdbcDataSource ds = new JdbcDataSource();
ds.setURL(EMBEDDED_JAVADB_JDBC_URL);
ds.setUser(EMBEDDED_JAVADB_JDBC_USER);
ds.setPassword(EMBEDDED_JAVADB_JDBC_PASSWORD);
final JNDIFactory jndiFactory = new JNDIFactory();
ReflectionUtils.setField(jndiFactory, "context", context);
jndiFactory.putResource(context, JNDI_DATASOURCE, ds);
}
@AfterClass
public static void tearDownClass() throws Exception {
context.unbind(JNDI_DATASOURCE);
context.destroySubcontext(JNDI_JAVA_JDBC);
context.destroySubcontext(JNDI_JAVA);
context.close();
System.clearProperty(Context.INITIAL_CONTEXT_FACTORY);
try (Statement stmt = getConnection().createStatement()) {
stmt.executeUpdate(String.format("drop user if exists %s", EMBEDDED_JAVADB_JDBC_USER));
}
if (!getConnection().isClosed()) {
getConnection().close();
}
}
}